package add_$17_Case_12_3;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
// 利用反射实现通过读取配置文件信息对类进行实例化
import java.util.Properties;

public class ReflexTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub

        // 创建Properties类对象(注：Properties是集合类，在集合那章学过)
        Properties property = new Properties();
        
        // 读取配置文件中的属性(从输入流中读取属性列表(键和元素对))
        property.load(ReflexTest.class.getResourceAsStream("/add_$17_Case_12_3/testProperties"));
        
        // 从property集合对象中通过键找值
        String className = property.getProperty("className");
        String methodName = property.getProperty("methodName");
        
        // 通过类名创建该类对应的字节码文件对象
        Class class0 = Class.forName(className);
        
        // 通过字节码文件对象创建对应类名的类所对应的对象，用Object对象来接收，这个应该也属于父类引用指向子类对象
        Object obj = class0.newInstance();
        
        // 执行获得该类的方法
        // obj.sleep();     // 父类引用指向子类对象，无法访问子类特有的方法，只能访问子类重写后的方法
        
        // 获得指定的方法对象
        Method method = class0.getMethod(methodName);
        
        // 执行该方法
        method.invoke(obj);
        
    }

}
